/*!
 * \file WtOrdMon.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 订单监控器
 * \details 用于监控和管理执行单元的订单状态，支持订单超时检查和撤单操作
 */
#pragma once
#include <unordered_map>
#include <stdint.h>
#include <functional>

#include "../Share/StdUtils.hpp"

/**
 * @brief 枚举订单回调函数类型
 * @param localid 本地订单号
 */
typedef std::function<void(uint32_t)> EnumOrderCallback;

/**
 * @class WtOrdMon
 * @brief 订单监控器类
 * @details 负责监控执行单元中的订单状态，包括：
 *          - 订单的添加和删除
 *          - 订单超时检查
 *          - 订单状态查询
 *          - 支持线程安全的订单管理
 */
class WtOrdMon
{
public:
	/**
	 * @brief 添加订单到监控列表
	 * @param ids 订单ID数组指针
	 * @param cnt 订单数量
	 * @param curTime 当前时间戳
	 * @param bCanCancel 是否可以撤销，默认为true
	 */
	void push_order(const uint32_t* ids, uint32_t cnt, uint64_t curTime, bool bCanCancel = true);

	/**
	 * @brief 从监控列表中删除订单
	 * @param localid 本地订单号
	 */
	void erase_order(uint32_t localid);

	/**
	 * @brief 检查是否有订单
	 * @param localid 本地订单号，为0时检查是否有任何订单，非0时检查是否有指定订单
	 * @return 有订单返回true，无订单返回false
	 */
	inline bool has_order(uint32_t localid = 0)
	{
		if (localid == 0)
			return !_orders.empty();

		auto it = _orders.find(localid);
		if (it == _orders.end())
			return false;

		return true;
	}

	/**
	 * @brief 检查订单是否超时
	 * @param expiresecs 超时时间（秒）
	 * @param curTime 当前时间戳
	 * @param callback 超时订单回调函数
	 */
	void check_orders(uint32_t expiresecs, uint64_t curTime, EnumOrderCallback callback);

	/**
	 * @brief 清空所有订单
	 */
	inline void clear_orders()
	{
		_orders.clear();
	}

private:
	/**
	 * @brief 订单信息对
	 * @details first: 进入时间戳，second: 是否可撤销
	 */
	typedef std::pair<uint64_t, bool> OrderPair;	///< uint64_t - entertime, bool - cancancel
	
	/**
	 * @brief 订单ID映射表类型
	 */
	typedef std::unordered_map<uint32_t, OrderPair> IDMap;
	
	IDMap			_orders;		///< 订单映射表，key为订单ID，value为订单信息
	StdRecurMutex	_mtx_ords;		///< 订单操作互斥锁，支持递归锁定
};

